#include <iostream>
#include <unistd.h>
#include <signal.h>
using namespace std;

// 如果我们不想等待子进程，并且还想让子进程退出之后，自动释放僵尸子进程
int main()
{
    signal(SIGCHLD, SIG_IGN); // 手动设置对子进程进行忽略
    // 和OS默认是忽略的的不一样 -> 该僵尸就僵尸
    if(fork() == 0)
    {
        cout << "child: " << getpid() << endl;
        sleep(7);
        cout << "子进程已经退出" << endl;
        exit(0);
    }

    while(true) // 父进程，不关心子进程
    {
        cout << "father: " << getpid() << " 执行自己的任务" << endl;
        sleep(1);
    }
    return 0;
}

// void handler(int signum)
// {
//     cout << "子进程退出: " << signum << " father pid: " << getpid() << endl;
// }
// int main()
// {
//     signal(SIGCHLD, handler);
//     if(fork() == 0)
//     {
//         cout << "child pid: " << getpid() << endl;
//         sleep(777);
//         exit(0);
//     }
//     while(true) 
//         sleep(1);
//     return 0;
// }

// volatile int quit = 0;
// void change_quit(int signum)
// {
//     (void)signum;
//     cout <<"change quit: "<< quit;
//     quit = 1;
//     cout << "->" << quit << endl;
// }
// int main()
// {
//     signal(2, change_quit);
//     while(!quit);
//     {
//         cout << "进程正常退出后：" << quit << endl;
//     }
//     return 0;
// }



// void showPending(sigset_t *pending)
// {
//     for(int sig = 1; sig <= 31; sig++)
//     {
//         if(sigismember(pending, sig)) cout << "1";
//         else cout << "0";
//     }
//     cout << endl;
// }
// void handler(int signum)
// {
//     cout << "获取了一个信号： " << signum << endl;
//     sigset_t pending;
//     int c = 20;
//     while(true)
//     {
//         sigpending(&pending);
//         showPending(&pending);
//         c--;
//         if(c == 0)
//         {
//             break;
//         }
//         sleep(1);
//     }
// }
// int main()
// {
//     signal(2, SIG_IGN);
//     cout << "getpid: " << getpid() << endl;
//     // 内核数据类型，用户栈定义的
//     struct sigaction act, oact;
//     act.sa_flags = 0; // 把这个赋为0,其它不用管
//     sigemptyset(&act.sa_mask); // 清空
//     act.sa_handler = handler;

//     sigaddset(&act.sa_mask, 3); // 处理2号信号期间随便把一些信号屏蔽
//     sigaddset(&act.sa_mask, 4);
//     sigaddset(&act.sa_mask, 5);
//     sigaddset(&act.sa_mask, 6);
//     sigaddset(&act.sa_mask, 7);
//     sigaddset(&act.sa_mask, 8);

//     // 设置进当前调用进程的pcb中
//     sigaction(2, &act, &oact);
//     cout << "default action : " << (int)(oact.sa_handler) << endl;

//     while (true)
//     {
//         sleep(1);
//     }
//     return 0;
// }